QT:多线程下载文件

您所在的位置:网站首页 qt urlencode QT:多线程下载文件

QT:多线程下载文件

2023-03-26 05:55| 来源: 网络整理| 查看: 265

这里的线程是指下载的通道(和操作系统中的线程不一样),一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配。不难理解,如果你线程多的话,那下载的越快。现流行的下载软件都支持多线程。

思路: 1:用阻塞的方式获取目标地址的HTTP头部,得到目标文件的大小。 2:算出每段文件的开始点,结尾点,并分别向目标地址发出请求。 3:每次目标地址有数据返回,都将得到的数据写入文件。

4:等待各段文件下载结果。

运行截图:

源代码:

#include #include //多线程下载的线程数 const int PointCount = 5; //目标文件的地址(千千静听的下载地址,我用来做实验的) const QString strUrl = "http://ttplayer.qianqian.com/otherdown/alladin/ttpsetup_5713.exe"; //用于下载文件(或文件的一部分) class Download : public QObject { Q_OBJECT private: QNetworkAccessManager m_Qnam; QNetworkReply *m_Reply; QFile *m_File; const int m_Index; qint64 m_HaveDoneBytes; qint64 m_StartPoint; qint64 m_EndPoint; public: Download(int index, QObject *parent = 0); void StartDownload(const QUrl &url, QFile *file, qint64 startPoint=0, qint64 endPoint=-1); signals: void DownloadFinished(); public slots: void FinishedSlot(); void HttpReadyRead(); }; //用于管理文件的下载 class DownloadControl : public QObject { Q_OBJECT private: int m_DownloadCount; int m_FinishedNum; int m_FileSize; QUrl m_Url; QFile *m_File; public: DownloadControl(QObject *parent = 0); void StartFileDownload(const QString &url, int count); qint64 GetFileSize(QUrl url); signals: void FileDownloadFinished(); private slots: void SubPartFinished(); }; Download::Download(int index, QObject *parent) : QObject(parent), m_Index(index) { m_HaveDoneBytes = 0; m_StartPoint = 0; m_EndPoint = 0; m_File = NULL; } void Download::StartDownload(const QUrl &url, QFile *file, qint64 startPoint/* =0 */, qint64 endPoint/* =-1 */) { if( NULL == file ) return; m_HaveDoneBytes = 0; m_StartPoint = startPoint; m_EndPoint = endPoint; m_File = file; //根据HTTP协议,写入RANGE头部,说明请求文件的范围 QNetworkRequest qheader; qheader.setUrl(url); QString range; range.sprintf("Bytes=%lld-%lld", m_StartPoint, m_EndPoint); qheader.setRawHeader("Range", range.toAscii()); //开始下载 qDebug() deleteLater(); qint64 size = var.toLongLong(); qDebug() open(QIODevice::WriteOnly); Download *tempDownload; //将文件分成PointCount段,用异步的方式下载 qDebug() deleteLater(); return 0; }



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3